/**
 * @file    inf_heating_pad.h
 * @author  yhy
 * @brief   加热垫模块头文件
 * @version 1.00
 * @date    2025-08-05
 *
 * @copyright Copyright (c) 2025
 *
 */
#ifndef __INF_HEATING_PAD_H__
#define __INF_HEATING_PAD_H__

#include "common_config.h"

#include <stdbool.h>
#include <stdint.h>

/**
 * @brief 加热垫索引枚举
 *
 */
typedef enum
{
    HEAT_IDX_HEATL = 0U,
    // HEAT_IDX_HEATR = 1U,
    HEAT_IDX_MAX,
} heat_idx_e;

/**
 * @brief 加热垫档位枚举
 *
 */
typedef enum
{
    HEAT_GEAR_CLOSE = 0U,   /*!< 关闭档位 0%占空比 */
    HEAT_GEAR_LOW   = 33U,  /*!< 低档位 33%占空比 */
    HEAT_GEAR_MID   = 67U,  /*!< 中档位 66%占空比 */
    HEAT_GEAR_HIGH  = 100U, /*!< 高档位 100%占空比 */
    HEAT_GEAR_MAX,
} heat_gear_e;

/**
 * @brief 加热垫故障枚举
 *
 */
typedef enum
{
    HEAT_FAULT_NONE        = 0U, /*!< 无故障 */
    HEAT_FAULT_OPEN_LOAD   = 1U, /*!< 过载故障 */
    HEAT_FAULT_SHORT       = 2U, /*!< 短路故障 */
    HEAT_FAULT_OVERCURRENT = 3U, /*!< 过载电流故障 */
    HEAT_FAULT_BLOCKED     = 4U, /*!< 阻塞故障 */
    HEAT_FAULT_MAX,
} heat_fault_e;

/**
 * @brief 加热垫PWM配置结构体
 *
 */
typedef struct
{
    uint32_t instance; /*!< PWM实例 */
    uint32_t pwm_ch;   /*!< PWM通道 */
} heat_pwm_config_t;

/**
 * @brief 加热垫结构体
 *
 */
typedef struct
{
    heat_pwm_config_t pwm_config; /*!< PWM配置 */
    heat_gear_e       gear;       /*!< 加热垫档位 */
    heat_gear_e       last_gear;  /*!< 加热垫上一次档位 */
    heat_fault_e      fault;      /*!< 加热垫故障 */
    bool              blocked;    /*!< 加热垫是否阻塞, 用于和通风互锁 */
} heat_t;

/**
 * @brief 加热垫系统结构体
 *
 */
typedef struct
{
    heat_t heats[HEAT_IDX_MAX]; /*!< 加热垫指针数组 */
    bool   ntc_enable;          /*!< NTC模块是否使能 */
    bool   system_enable;       /*!< 加热垫系统是否使能 */
} heat_system_t;

result_e     inf_heat_init(void);
void         inf_heat_set_system_enable(bool enable);
result_e     inf_heat_set_gear(heat_idx_e idx, heat_gear_e gear);
result_e     inf_heat_set_fault(heat_idx_e idx, heat_fault_e fault);
result_e     inf_heat_check_interlock(heat_idx_e idx, bool blocked);
heat_gear_e  inf_heat_get_gear(heat_idx_e idx);
heat_fault_e inf_heat_get_fault(heat_idx_e idx);
bool         inf_heat_get_bolcked_status(heat_idx_e idx);
void         inf_heat_handle(void);

#endif
